package com.ustcinfo.study.scala.r5.mouyiquan

import org.apache.spark.{SparkConf, SparkContext}

/**
  * Author: Yiquan Mou
  * Email: ctbumyq@gmail.com
  * Description: 简单的cala语法练习
  * Date: Created in 18:53 2018/8/3
  */

object Demo {
  def main(args: Array[String]) {

      /*
        setMaster主要是连接主节点，如果参数是”local”，
        则在本地用单线程运行spark，如果是 local[4]，则在本地用4核运行，
        如果设置为spark://master:7077，就是作为单节点运行，
        而setAppName就是在web端显示应用名而已，它们说到底都调用了set()函数
      */
      val sparkConf = new SparkConf().setMaster("local").setAppName("mouyiquanTest")
     /*
       SparkContext对象包含各种方法来创建和操作分布式数据集和共享变量
      */
      val sc = new SparkContext(sparkConf)

      //读取本地文件放入Rdd
      val txtRdd = sc.textFile("src/main/resources/sampleData/programmingGuide")

      var sum = 0;  //总的http访问数
      txtRdd
      .filter(x => x.trim().length>0) //对数据进行过滤，空数据行不要
      .map( x => x.split(" "))        //将每一行进行空格拆分，并且返回一个字符串数组给x
      .flatMap(x => x)                //对二维数据进行一个拉伸，变成一个一维数组
      .map(x => (x,1))                //将x转变为 (x,1),方便后面进行数据统计
      .reduceByKey(_ +  _)            //将x作为key值进行预处理统计，相当于MR里面的Conbiner，相当于func(x,y){return x+y}
      .map(x => (x._2,x._1))          //通过Tuple2 进行(x,1)类型的数据进行对调成(1,x)
      .sortByKey(false)               //soretByKey(false)设置通过Key进行排序，而false相当于desc降序排列
      .take(10)                       //相当于top 10，取前10个结果集
      .foreach(println)               //循环打印结果集
  }
}
